package com.zhaokuner.pm.common.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import java.util.*;

/**
 * json 处理 优先使用
 *
 * @author zhaokuner
 */
public class JsonUtils {

    /**
     * json 字符串 转换成 对象
     * <p>Jackson
     *
     * @param json  json
     * @param clazz clazz
     * @param <T>   <T>
     * @return T
     */
    public static <T> T readValue(String json, Class<T> clazz) {
        return JacksonUtils.readValue(json, clazz);
    }

    /**
     * 根据json中的子对象转换对象
     * <p>FastJson
     *
     * @param json  json
     * @param path  path
     * @param clazz clazz
     * @param <T>   <T>
     * @return T
     */
    public static <T> T readChildValue(String json, String path, Class<T> clazz) {
        if (null == json || json.isEmpty()) {
            return null;
        }
        JSONObject jsonObject = JSON.parseObject(json);
        if (null == path || path.isEmpty()) {
            return jsonObject.toJavaObject(clazz);
        }
        return jsonObject.getObject(path, clazz);
    }

    /**
     * json 字符串 转换成 List对象
     * <p>Jackson
     *
     * @param <T>    <T>
     * @param json   json
     * @param tClazz tClazz
     * @return List
     */
    public static <T> ArrayList<T> readArrayListValue(String json, Class<T> tClazz) {
        return JacksonUtils.readArrayListValue(json, tClazz);
    }

    /**
     * json 字符串 转换成 List对象
     * <p>Jackson
     *
     * @param <T>    <T>
     * @param json   json
     * @param tClazz tClazz
     * @return HashSet
     */
    public static <T> HashSet<T> readHashSetValue(String json, Class<T> tClazz) {
        return JacksonUtils.readHashSetValue(json, tClazz);
    }

    /**
     * Json 字符串 转换成Collection对象
     * <p>Jackson
     *
     * @param <U>    <U>
     * @param <T>    <T>
     * @param json   json
     * @param uClazz uClazz
     * @param tClazz tClazz
     * @return Collection
     */
    public static <U extends Collection<T>, T> U readValue(String json, Class<U> uClazz, Class<T> tClazz) {
        return JacksonUtils.readValue(json, uClazz, tClazz);
    }

    /**
     * json 转换成Map
     * <p>Jackson
     *
     * @param <T>    <T>
     * @param json   json
     * @param tClazz tClazz
     * @return HashMap
     */
    public static <T> HashMap<String, T> readMapValue(String json, Class<T> tClazz) {
        return JacksonUtils.readMapValue(json, tClazz);
    }

    /**
     * json 转换成Map
     * <p>Jackson
     *
     * @param <U>    <U>
     * @param <T>    <T>
     * @param json   json
     * @param uClazz uClazz
     * @param tClazz tClazz
     * @return Map
     */
    public static <U extends Map<String, T>, T> U readMapValue(String json, Class<U> uClazz, Class<T> tClazz) {
        return JacksonUtils.readMapValue(json, uClazz, tClazz);
    }

    /**
     * json to map
     * <p>FastJson
     *
     * @param json json
     * @return Map
     */
    public static Map<String, Object> readMapValue(String json) {
        return JSON.parseObject(json);
    }

    /**
     * 格式化 json
     * <p>Jackson
     *
     * @param t t
     * @return String
     */
    public static String toPretty(Object t) {
        return JacksonUtils.toPretty(t);
    }

    /**
     * 换成json
     * <p>FastJson
     *
     * @param t t
     * @return String
     */
    public static String toJson(Object t) {
        return JSON.toJSONString(t);
    }

}
